<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// - 原型链继承
	// - 缺点：父类当中提供的属性方法全部都来原型链。这些数据和方法对于实例而言是共享的。容易使数据的混乱。
	{
		// function Desk(){
		// 	this.age = 12;
		// }
		// Desk.prototype.run = function(){
		// 	console.log('run');
		// }
		// function Box(){
		// 	this.userName = "zhangsan";
		// }
		// Box.prototype = new Desk();
		// Box.prototype.constructor = Box;
		// const obj = new Box();
		// // obj.run();
		// // console.log(obj.age);// 12
		// // console.log(obj.__proto__ === Box.prototype);// true
		// // console.log(Box.prototype.__proto__ === Desk.prototype);// true
		// // console.log(Desk.prototype.__proto__ === Object.prototype);// true
		// // console.log(Object.prototype.__proto__);// null
		//
		// const obj2 = new Box();
		// obj2.__proto__.age = 100;
		// console.log(obj.__proto__ === obj2.__proto__);
		// console.log(obj.age);
	}
	// - 冒充继承：借用构造函数继承:只能够继承父类当中的实例，不会继承原型。
    // - 缺点：无法继承父类的原型对象的。
	{
		// function Desk(){
		// 	this.age = 100;
		// }
		// Desk.prototype.fn = function(){
		// 	console.log("desk->fn");
		// }
		// function Box(){
		// 	this.a = 1;
		// 	Desk.apply(this);
		// }
		// const obj = new Box();
		// console.log(obj.age,obj.a);
		// obj.fn();
	}
	
	// - 原型链+借用构造函数的组合继承
	{
		function Desk(age){
			this.age = age;
		}
		Desk.prototype.fn = function(){
			console.log("fn");
		}
		function Box(age){
			this.userName = "zhangsan";
			Desk.call(this,age);
		}
		Box.prototype = Desk.prototype;
		Box.prototype.constructor = Box;
		const obj = new Box(100);
		console.log(obj);
		obj.fn();
	}
</script>
</html>